#ifndef ACTOR_H
#define	ACTOR_H

#include <string>
#include "Trayectoria.h"
#include "IDesplazable.h"
#include "Rol.h"
#include "IColisionante.h"
#include "ISerializable.h"
#include "ActoresConstantes.h"
#include "UtilidadesConstantes.h"
#include "Perimetro.h"
#include "Piso.h"
#include "tinyxml.h"

using namespace std;
using namespace TP::Serializacion;
using namespace TP::Juego::Arena;
using namespace TP::Juego::Motorizacion::Fisica;
using namespace TP::Juego::Motorizacion::Colisiones;
using namespace TP::Juego::Arena::Utilidades;

namespace TP { namespace Juego { namespace Arena { namespace Actores {

class Actor : public IDesplazable, public IColisionante, public IColisionado,
        public ISerializable {

public:
    
    Actor ();
    
    Actor(const string& pNombre, Rol* pRol);
    
    virtual ~Actor();
    
    string& Nombre();
    
    Trayectoria* getTrayectoria ();
    
    Trayectoria* setTrayectoria (Trayectoria* pTrayectoria);
    
    Ticks desplazar(Ticks pTiempo);
    
    Rol* getRol (); 
    
    virtual string aXML() = 0;
    
    virtual string aXML(const string& pPath) = 0;
    
    virtual void parseXML (const string& pDescriptor) = 0;
    
    virtual TiXmlElement* aElementoXML () = 0;
    
    virtual void deElementoXML (TiXmlElement* pElemento) = 0; 
    
    static Actor* deElementoXMLGenerico (TiXmlElement* pElemento);
    
    // Retorna la vida del actor.
    double getVida();
    
    // Setea la vida del actor.
    void setVida(double vida);
    
    // Pone a 0 la vida del actor.
    void destruir();
    
    // Retorna true si el actor fue destruido; de lo contrario, retorna false.
    bool destruido() const;
    
    // Setea si el actor es enemigo del player o no.
    void setEsEnemigo(bool esEnemigo);
    
    // Retorna true si el actor es enemigo del player; de lo contrario, retorna false.
    bool esEnemigo() const;
    
    // Decrementa la energía del actor con la cantidad de energía pasada.
    void decrementarEnergia (double cantidadEnergia);
    
    // Retorna el radio del actor.
    virtual double getRadio() = 0;
    
    // Retorna los puntos del actor por ser destruido.
    virtual int getPuntosDestruccion() = 0;
    
    // Retorna el daño que le hace el actor a un cerdito.
    virtual double getDanioContraCerdito () = 0;
    
    // Retorna el daño que le hace el actor a una superficie.
    virtual double getDanioContraSuperficie () = 0;
    
    // Retorna el daño que le hace el actor a un pajarito.
    virtual double getDanioContraPajarito () = 0;

protected:
    string& setNombre (const string& pNombre);
    
    void _obtenerAtributosDeRecta(Posicion *pos_inicial,Posicion *pos_final , 
    double &pendiente, double &puntoDePaso);
    
    virtual Actor* colisionarContraActor(Actor* pActor) = 0;
    
    virtual Utilidad* colisionarContraUtilidad (Utilidad* pUtilidad) = 0;
    
    virtual Perimetro* colisionarContraPerimetro (Perimetro* pPerimetro) = 0;
    
    virtual Piso* colisionarContraPiso (Piso* pPiso) = 0;
    
private:
    string _nombre;
    Rol* _rol;
    Trayectoria* _trayectoria;
    double _vida;
    bool _enemigo;
};   
}}}}

#endif	/* ACTOR_H */